package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

/*
系统函数
*/
func main() {
	//统计字符串的长度,按字节进行统计
	str := "go你好"
	//中文是UTF-8字符集,一个汉字3个字节
	fmt.Println(len(str))
	fmt.Println("-------- -------- --------")

	//字符串遍历
	for i, val := range str {
		fmt.Printf("索引为: %d, 具体值为: %c \n", i, val)
	}
	fmt.Println()
	fmt.Println("-------- -------- --------")

	//字符串遍历
	r := []rune(str)
	for i := 0; i < len(r); i++ {
		fmt.Printf("str值为: %c \n", r[i])
	}
	fmt.Println()
	fmt.Println("-------- -------- --------")

	//字符串转整数：
	n, _ := strconv.Atoi("66")
	fmt.Println(n)
	fmt.Println("-------- -------- --------")

	//整数转字符串
	var str2 string = strconv.Itoa(6887)
	fmt.Println(str2)
	fmt.Println("-------- -------- --------")

	//统计一个字符串有几个指定的子串
	cnt := strings.Count("javaandgolang", "a")
	fmt.Println("Count", cnt)
	fmt.Println("-------- -------- --------")

	flag := strings.Contains("javaandgolang", "go")
	fmt.Println("Contains", flag)
	fmt.Println("-------- -------- --------")

	//不区分大小写的比较
	flag2 := strings.EqualFold("hello", "HELLO")
	fmt.Println("EqualFold", flag2)
	fmt.Println("-------- -------- --------")

	//区分大小写的比较
	flag3 := "hello" == "HELLO"
	fmt.Println("==", flag3)
	fmt.Println("-------- -------- --------")

	//查找字符第一次出现的下标
	idx := strings.Index("javaandgolang", "a")
	fmt.Println("Index", idx)
	fmt.Println("-------- -------- --------")

	//n可以指定你希望替换几个,如果n=-1表示全部替换，替换两个n就是2
	str11 := strings.Replace("goandjavagogo", "go", "golang", -1)
	str12 := strings.Replace("goandjavagogo", "go", "golang", 2)
	fmt.Println(str11)
	fmt.Println(str12)
	fmt.Println("-------- -------- --------")

	//按照指定的某个字符，为分割标识，将一个学符串拆分成字符串数组
	arr1 := strings.Split("go-python-java", "-")
	fmt.Println(arr1)
	fmt.Println("-------- -------- --------")

	//将字符串的字母进行大小写的转换
	str21 := strings.ToLower("Go") // go
	str22 := strings.ToUpper("go") //GO
	fmt.Println(str21)
	fmt.Println(str22)
	fmt.Println("-------- -------- --------")

	//将字符串左右两边的空格去掉
	str23 := strings.TrimSpace("     go and java    ")
	fmt.Println(str23)
	fmt.Println("-------- -------- --------")

	//将字符串左右两边指定的字符去掉
	str24 := strings.Trim("~golang~ ", " ~")
	fmt.Println(str24)
	fmt.Println("-------- -------- --------")

	//将字符串左边指定的字符去掉
	str25 := strings.TrimLeft("~golang~ ", " ~")
	fmt.Println(str25)
	fmt.Println("-------- -------- --------")

	//将字符串右边指定的字符去掉
	str26 := strings.TrimRight("~golang~ ", " ~")
	fmt.Println(str26)
	fmt.Println("-------- -------- --------")

	//判断字符串是否以指定的字符串开头
	str27 := strings.HasPrefix("http://java.sun.com/jsp/jstl/fmt", "http")
	fmt.Println(str27)
	fmt.Println("-------- -------- --------")

	//判断字符串是否以指定的字符串结束
	str28 := strings.HasSuffix("demo.png", ".png")
	fmt.Println(str28)
	fmt.Println("-------- -------- --------")

	fmt.Println()
	fmt.Println()
	fmt.Println()

	//判断字符串是否以指定的字符串结束
	//时间和日期的函数，需要到入time包，所以你获取当前时间，就要调用函数Now函数：
	now := time.Now()
	//Now()返回值是一个结构体，类型是：time.Time
	fmt.Printf("%v ~~~ 对应的类型为：%T\n", now, now)
	//2021-02-08 17:47:21.7600788 +0800 CST m=+0.005983901 ~~~ 对应的类型为：time.Time
	//调用结构体中的方法：
	fmt.Printf("年：%v \n", now.Year())
	fmt.Printf("月：%v \n", now.Month())      //月：February
	fmt.Printf("月：%v \n", int(now.Month())) //月：2
	fmt.Printf("日：%v \n", now.Day())
	fmt.Printf("时：%v \n", now.Hour())
	fmt.Printf("分：%v \n", now.Minute())
	fmt.Printf("秒：%v \n", now.Second())
	fmt.Println("-------- -------- --------")

	//Printf将字符串直接输出：
	fmt.Printf("当前年月日： %d-%d-%d 时分秒：%d:%d:%d  \n", now.Year(), now.Month(),
		now.Day(), now.Hour(), now.Minute(), now.Second())
	//Sprintf可以得到这个字符串，以便后续使用：
	datestr := fmt.Sprintf("当前年月日： %d-%d-%d 时分秒：%d:%d:%d  \n", now.Year(), now.Month(),
		now.Day(), now.Hour(), now.Minute(), now.Second())
	fmt.Println(datestr)
	fmt.Println("-------- -------- --------")

	//这个参数字符串的各个数字必须是固定的，必须这样写
	//go语言诞生的时间, 年月日时分秒 必须按下面提供的数字这么写(不能写yyyyMMdd HHmmssSSS)
	datestr2 := now.Format("2006/01/02 15/04/05")
	fmt.Println(datestr2)
	//选择任意的组合都是可以的，根据需求自己选择就可以（自己任意组合）。
	datestr3 := now.Format("2006 15:04")
	fmt.Println(datestr3)
	fmt.Println("-------- -------- --------")

	/*
	   【1】什么是内置函数/内建函数：
	   Golang设计者为了编程方便，提供了一些函数，这些函数不用导包可以直接使用，我们称为Go的内置函数/内建函数。

	   【2】内置函数存放位置：
	   在builtin包下，使用内置函数也的，直接用就行

	   【3】常用函数：
	   （1）len函数：
	   统计字符串的长度,按字节进行统计
	*/
	str31 := "123456"
	fmt.Println(len(str31))
	fmt.Println("-------- -------- --------")

	/*
		new函数：
		分配内存，主要用来分配值类型（int系列, float系列, bool, string、数组和结构体struct）
		内建函数new分配内存. 其第一个实参为类型,而非值. 其返回值为指向该类型的新分配的零值的指针
	*/
	num := new(int)
	fmt.Println(*num)
	*num = 69
	fmt.Printf("num的类型: %T, num的值是: %v, num的地址: %v, num的指针指向的值是: %v", num, num, &num, *num)
	fmt.Println()
	fmt.Println("-------- -------- --------")

	/*
		（3）make函数：
		分配内存，主要用来分配引用类型（指针、slice切片、map、管道chan、interface 等）
	*/

}
